[Design Pattern] Adapter

[디자인 패턴][구조 패턴] 어댑터

Posted by ChaelinJ on April 11, 2021

어댑터

한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환시키는 패턴

  • 호환성 문제로 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다.
    • 클라이언트와 구현된 인터페이스를 분리시킬 수 있으며, 향후 인터페이스가 바뀌더라도 클라이언트가 바뀔 필요가 없습니다.

서로 다른 인터페이스를 가진 두 클래스를 어댑터 클래스로 인터페이스를 통일시킵니다.

다이어그램

  • 클라이언트: 써드파티 라이브러리나 외부 시스템을 이용하고자 하는 쪽
  • Adaptee: 써드파티 라이브러리나 외부 시스템
  • Target: Adapter에 의해 구현되는 인터페이스
  • 클라이언트는 Target Interface를 통해 Adaptee를 사용할 수 있습니다.

어댑터의 용도

왜 클라이언트는 직접 Adaptee가 아닌 Target에 접근해서 Apdater로의 변환을 거치는 것일까요?

  • 구버전 인터페이스와 신버전 인터페이스를 혼용해야 할 때
    • 신버전을 이용하듯 구버전을 오류 없이 사용할 수 있습니다.
    • 구버전에 지원되지 못할 부분에 대해 미리 예외처리를 예고 없이 종료되는 것을 방지할 수 있습니다.
  • 서로 다른 인터페이스를 사용하는 시스템을 통합할 때

어댑터의 이해 및 예제

110V를 사용하는 전자제품 A, 220V를 사용하는 전자제품 B가 있습니다.

Client에서 A, B를 한 멀티탭에 꽂아 작동할 것입니다. 하지만 둘 중 하나는 변환이 필요합니다.

A에 어댑터를 이용해서 서로 다른 인터페이스를 사용하는 A, B를 같이 사용해봅시다.

  • 220V, 110V는 인터페이스
  • MachineA, MachineB는 110V, 220V를 구현하는 클래스
  • Adapter는 110V를 220V로 변환하는 클래스로, 220V 인터페이스를 구현
  • Client(multiTap)에서 ArrayList(220V 인터페이스를 저장)에 MachineA, MachineB를 같이 사용

interface

class

Adapter class

Main

위의 main대로 하면 오류가 발생합니다.

Exception in thread "main" java.lang.ClassCastException: class MachineA cannot be cast to class Volt220

Adapter 없이 110V A를 220V 멀티탭에 꽂으면 오류가 나죠? 그것처럼 호환이 안 되는 문제가 발생합니다.

저 부분을 주석처리하고 돌렸을 때의 콘솔창입니다.

B: 220v
Adapter use!(220V)

오류 없이 잘 나왔습니다.

어댑터 패턴은 돼지코(변환기)처럼 사이에서 변환 역할을 해주는 것입니다. 어렵지 않은 예제로 살펴보았습니다.

Class Adapter VS Object Adapter

저희가 예시까지 본 구조는 Object Adapter입니다. class adapter와는 차이가 있습니다.

Class Adapter 구조

Class Adapter는 위처럼 다중상속을 이용합니다.

Adaptee와 Target을 다중상속하는 Adapter입니다. Adaptee를 상속이 아닌 조합(Composition)으로 사용하는 Object Adapter와는 차이가 있습니다.

두 가지를 비교해 보았습니다.

Object Adapter

장점 상속이 아닌 조합(Composition)을 이용하기 때문에 유연합니다.     Adaptee의 모든 서브클래스에 대해 어댑터 사용 가능합니다.
단점 Adaptee 객체를 변수로 저장해야하기 때문에 객체를 생성해야 합니다.      

상속보다 조합 활용해야 하는 부분은 다음 링크를 참조해주세요. 상속보다는 조합(Composition)을 사용하자.

  • 추가적으로 조합을 활용했기 때문에 런타임 중에 Adaptee가 결정되어 유연합니다.

Class Adapter

장점 Adapter가 Adaptee의 서브클래스이기 때문에 Adaptee의 객체를 생성하지 않아도 됩니다.
단점 상속을 이용하기 때문에 한 Adapter 클래스가 특정 Adaptee 클래스에만 적용됩니다.
  • 추가적으로 Java와 같이 다중상속이 지원되지 않으면 사용할 수 없습니다.

참고

감사합니다.

Text by Chaelin. Photographs by Chaelin, Unsplash.